package Voice;

import Voice.interfere.VoiceChatCallback;

import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;

import static Voice.VoiceChatUtil.voiceChatFunction;
/*
                            A电脑
java -jar VoiceChatUtil.jar <服务端对应的uid> <服务端监听的IP地址（通常为本地IP）> <服务端接收端口>
<服务端发送端口（如果服务端也需要发送数据，设置相应端口；若不需要可随意设置一个未被占用的端口）>
 <服务端对应的回调函数实现类路径（如果有，可先忽略，后续详细解释）>
*/
/*
                            b电脑
  java -jar VoiceChatUtil.jar <客户端对应的uid> <客户端要连接的服务端IP地址（即电脑A的IP）> <客户端发送端口>
   <客户端接收端口（如果客户端也需要接收数据，设置相应端口；若不需要可随意设置一个未被占用的端口）>
   <客户端对应的回调函数实现类路径（如果有，可先忽略，后续详细解释）>
 */
public class Main {
    // 用于存储客户端连接的Socket
    private static List<Socket> clientSockets = new ArrayList<>();
    // 用于存储所有客户端Socket的并发安全队列
    private static ConcurrentLinkedQueue<Socket> allClientSockets = new ConcurrentLinkedQueue<>();

    public static void main(String[] args) {
        String uid = null;
        String ipAddress = null;
        int sendPort = 0;
        int receivePort = 0;
        VoiceChatCallback callback = null;

        // 检查命令行参数个数是否正确
        if (args.length!= 4 && args.length!= 5) {
            System.out.println("参数个数不正确，请按照以下格式输入参数：uid ipAddress sendPort receivePort [callbackClassPath]");
            return;
        }

        try {
            uid = args[0];
            ipAddress = args[1];
            sendPort = Integer.parseInt(args[2]);
            receivePort = Integer.parseInt(args[3]);

            // 如果传入了5个参数，尝试解析回调函数实现类路径并创建实例
            if (args.length == 5) {
                callback = createCallbackInstance(args[4]);
            }
        } catch (Exception e) {
            System.out.println("参数解析错误，请检查输入的参数格式是否正确");
            e.printStackTrace();
            return;
        }

        // 调用语音聊天功能函数
        voiceChatFunction(uid, ipAddress, sendPort, receivePort, callback);
    }

    // 其他代码部分，如voiceChatFunction、handleDisconnect、ClientHandler等方法保持不变

    // 以下是通过反射创建回调函数实例的示例方法，这里假设配置文件中指定了完整的类路径
    private static VoiceChatCallback createCallbackInstance(String callbackClassPath) {
        try {
            Class<?> callbackClass = Class.forName(callbackClassPath);
            return (VoiceChatCallback) callbackClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
